package smallfrench.moteur.lexer;

import smallfrench.moteur.lexer.err.ErreurLexemeAttendu;
import smallfrench.moteur.lexer.err.ErreurLexer;
import smallfrench.moteur.lexer.lexemes.Lexeme;
import smallfrench.moteur.lexer.lexemes.TypeLexeme;

public class AutomateCommentaire extends Automate {


	private void passerJusquAEtoileSlash(
			Position debut, LecteurChaine r)
					throws ErreurLexer {

		char c;
		int profondeur = 1;

		while (! r.isEof()) {

			c = r.suivant();

			if (r.isEof()) break;

			switch (c) {

			case '*':
				c = r.suivant();
				if (c == '/') {
					profondeur--;
					if (profondeur == 0)
						return;
				}
				r.precedent();
				break;

			case '/':
				c = r.suivant();
				if (c == '*') {
					profondeur++;
					break;
				}
				r.precedent();
				break;
			}

		}

		throw new ErreurLexemeAttendu("*/", debut);
	}

	private void passerLigne(LecteurChaine r) {
		char c;
		while (! r.isEof()) {
			c = r.suivant();
			if (c == '\n') {
				return;
			}
		}
	}

	@Override
	public Lexeme analyser(LecteurChaine lecteur, Position debut)
			throws ErreurLexer {

		char c = lecteur.suivant();

		if (!lecteur.isEof() && c == '/') {
			c = lecteur.suivant();

			if (c == '*') {

				// commentaire bloc /* */
				passerJusquAEtoileSlash(debut, lecteur);
				return new Lexeme(TypeLexeme.COMMENTAIRE_BLOC,
						debut, lecteur.getPosition());

			} else if (c == '/') {
				// commentaire ligne //
				passerLigne(lecteur);
				return new Lexeme(TypeLexeme.COMMENTAIRE_LIGNE,
						debut, lecteur.getPosition());
			}
			lecteur.precedent();
		}
		lecteur.precedent();
		return null;
	}

}
